import { IErrorCodeDescript } from './type'
/**
 * 获取错误信息
 * ：返回值必须是enum中的key的类型
 * @param message
 * @returns
 */
function getErrorCode(message: string): string {
  // 错误信息里未包含message, 自定义一个错误信息
  if (!message || typeof message !== 'string') {
    return 'unknown'
  }
  // 超时错误
  if (message.includes('timeout')) {
    return '504'
  }
  const errorCodes = message.match(/\d{3}/g)
  // 无法正常获取错误码
  if (!errorCodes) {
    return 'unknown'
  }
  // 错误码非常见类型
  return errorCodes[0]
}

const codeDescript: IErrorCodeDescript = {
  '400': message => ({
    status: 400,
    errorMessage: [message, '未能获取有效服务, 请稍后重试'],
  }),
  '401': message => ({
    status: 401,
    errorMessage: [message, '用户身份信息异常, 请尝试重新登陆'],
  }),
  '404': message => ({
    status: 404,
    errorMessage: [message, '未找到对应的资源, 请稍后重试或联系管理员'],
  }),
  '500': message => ({
    status: 500,
    errorMessage: [message, '服务器异常, 请刷新或稍后重试'],
  }),
  '502': message => ({
    status: 502,
    errorMessage: [message, '返回数据无效, 请稍后重试或联系管理员'],
  }),
  '503': message => ({
    status: 503,
    errorMessage: [message, '服务器响应超时, 请稍后重试'],
  }),
  '504': message => ({
    status: 504,
    errorMessage: [message, '网络超时, 请检查网络或稍后重试'],
  }),
  unknown: message => ({
    status: 'unknown',
    errorMessage: [message, '服务异常, 请联系管理员或稍后重试'],
  }),
}

export default function ErrorHandler(err: any) {
  const message = err.message || err.Message
  // 获取错误状态码
  const errorCode = getErrorCode(message)
  // 返回匹配的结果
  return codeDescript[errorCode](message)
}
